home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / cstdio.arc / SRC.ARC / SETARGS.C < prev    next >
C/C++ Source or Header  |  1985-10-14  |  2KB  |  113 lines

  1. /*    _setargs.c - set arguments from command string.
  2.     (C) Copyright 1984, 1985 Gregory R. Mansfield - All Rights Reserved.
  3.     G. R. Mansfield.  84/11/05.
  4.     Ver 1.1-5A14.
  5. */
  6.  
  7. #include <defstd.h>
  8. #include <ctypem.h>
  9.  
  10. /* local functions */
  11. static int glf();
  12.  
  13. int _setargs(ast, apt, s)
  14.             /* returns argc */
  15. char *s;    /* command string */
  16. char **apt;    /* argument pointer table same as *argv[] */
  17. char *ast;    /* argument strings */
  18. {
  19.     char **apti;
  20.     int n, nx, wm, ws;
  21.  
  22.     apti = apt;
  23.     *apt++ = ast;    /* enter zero th argument */
  24.     *ast++ = '*';
  25.     *ast++ = '\0';
  26.     n = 1;
  27.     while (*s) {
  28.         while (*s == ' ')    /* skip spaces between arguments */
  29.             s++;
  30.         nx = wm = ws = 0;        /* copy argument noting wildcard characters */
  31.         *apt = ast;
  32.         while (*s && *s != ' ') {
  33.             if (*s == '*')
  34.                 wm++;
  35.             if (*s == '?')
  36.                 ws++;
  37.             if (*s == '.')
  38.                 nx++;
  39.             *ast++ = *s++;
  40.         }
  41.         if (ast > *apt) {
  42.             *ast++ = '\0';
  43.             if (wm + ws) {    /* expand wild card file names */
  44.                 if (wm && !nx) {
  45.                     ast--;
  46.                     *ast++ = '.';
  47.                     *ast++ = '*';
  48.                     *ast++ = '\0';
  49.                 }
  50.                 apt += glf(*apt, apt, *apt);
  51.                 ast = *apt;
  52.             }
  53.             else
  54.                 apt++;
  55.         }
  56.     }
  57.     *apt = ast;
  58.     return(apt - apti);
  59. }
  60.  
  61. static int glf(wn, fp, fnt)    /* get list of files */
  62. char **fp, *fnt, *wn;
  63. {
  64.     struct msstat {
  65.         BYTE st_attr;
  66.         long st_ct;
  67.         long st_size;
  68.         char st_name[13];
  69.     };
  70.     struct msb_s {
  71.         BYTE res[21];
  72.         struct msstat st;
  73.     } msb;
  74.     char *fnti, **fpi, *p, pn[65];
  75.     int gap, i, j, n;
  76.  
  77.     fnti = fnt;
  78.     fpi = fp;
  79.     i = msfmf(wn, 0x17, &msb);    /* get first entry */
  80.     for (p = pn; *wn; wn++)    /* prepare path name */
  81.         *p++ = tolower(*wn);
  82.     while (p > pn && *(p-1) != '/' && *(p-1) != '\\' && *(p-1) != ':')
  83.         p--;
  84.     *p = '\0';
  85.     while (!i) {
  86.         if (*msb.st.st_name != '.') {    /* add name if not a directory */
  87.             n++;
  88.             *fpi++ = fnt;
  89.             for (p = pn; *p; p++)    /* copy path name */
  90.                 *fnt++ = *p;
  91.             for (p = msb.st.st_name; *p; p++)    /* add file name */
  92.                 *fnt++ = tolower(*p);
  93.             *fnt++ = '\0';
  94.         }
  95.         i = msfnf();
  96.     }
  97.     *fpi = fnt;    /* terminate list */
  98.     n = fpi - fp;
  99.  
  100.     for (gap = n/2; gap > 0; gap /= 2) {    /* sort list pointers */
  101.         for (i = gap; i < n; i++) {
  102.             for (j = i-gap; j >= 0; j -= gap) {
  103.                 if (strcmp(fp[j], fp[j+gap]) <= 0) 
  104.                     break;
  105.                 fpi = fp[j];
  106.                 fp[j] = fp[j+gap];
  107.                 fp[j+gap] = fpi;
  108.             }
  109.         }
  110.     }
  111.     return(n);
  112. }
  113.